gpt4 book ai didi

python - 在for循环中赋值之前引用的局部变量

转载 作者:行者123 更新时间:2023-12-03 08:33:22 24 4
gpt4 key购买 nike

我们必须阅读一个轨迹xyz文件(py3dmol),计算所有“相”在C和O原子之间的键长,并将这些键长添加到列表中。
当我尝试使用给定的文件执行它时,它给我错误“分配前引用的局部变量'c_line'”。我想我明白问题出在哪里-我必须告诉循环继续执行语句中分配的变量,但是我该如何解决呢?我试过将坐标分配(c_x = etc)放在if语句中,但是然后在co_vectoro_x行中触发了相同的错误,或者该函数未返回任何内容。
还是我做的完全错误?我已经尝试了所有可以想到的变化,但是我感觉到自己可能受到精神障碍的困扰。
编辑:我明白是什么问题。 if语句仅允许一次定义一个c_lineo_line,而我需要为每个循环都定义两个定义来执行计算。但是我不知道如何通过if语句搜索文件中的那些特定行。 (我希望这是有道理的)有什么想法可以解决这个问题吗?在作业中它表示我们应该以某种方式使用if语句。


def co_bond(file):

file = open(file,'r') ## read file
lines = file.readlines()
file.close()

bond_list = []
c_x = 0
c_y = 0
c_z = 0

o_x = 0
o_y = 0
o_z = 0

for line in lines: # loop through entire file
if line.startswith("c"): # find c-atom lines
c_line = line.split()[1:] # have only coordinates (first item is atom name)
elif line.startswith("o"): # find o-atom lines
o_line = line.split()[1:]

c_x = float(c_line[0]) # create c-atom coordinates
c_y = float(c_line[1])
c_z = float(c_line[2])

o_x = float(o_line[0]) # create o-atom coordinates
o_y = float(o_line[1])
o_z = float(o_line[2])

co_vector = [o_x - c_x, o_y - c_y, o_z - c_z] # create vector between c and o
co_length = sqrt(co_vector[0]**2 + co_vector[1]**2 + co_vector[2]**2) # calculate bondlength

bond_list_filled = bond_list.append(co_length)

return bond_list_filled

最佳答案

尝试这个:

if line.startswith("c"):  # find c-atom lines
c_line = line.split()[1:] # have only coordinates (first item is atom name)
c_x = float(c_line[0]) # create c-atom coordinates
c_y = float(c_line[1])
c_z = float(c_line[2])


elif line.startswith("o"): # find o-atom lines
o_line = line.split()[1:]
o_x = float(o_line[0]) # create o-atom coordinates
o_y = float(o_line[1])
o_z = float(o_line[2])


问题是,当其中一条线是o原子时,您没有定义c_line,而是在执行c_line [0]时使用了它。因此,在为变量c_line赋值之前,请先对其进行引用。

关于python - 在for循环中赋值之前引用的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64526127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com