Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更新文件中的变量_Python_Python 3.x - Fatal编程技术网

Python 更新文件中的变量

Python 更新文件中的变量,python,python-3.x,Python,Python 3.x,我试图更改另一个文件中的多个变量,但只有一个变量会得到更新,除非我关闭并重新进入程序。这是代码的简单版本: import pyVars def loop(): newVar = int(input('New var: ')) temp1 = newVar temp2 = pyVars.varA temp3 = pyVars.varB f = open('pyVars.py', 'w') f.close() f = open('pyV

我试图更改另一个文件中的多个变量,但只有一个变量会得到更新,除非我关闭并重新进入程序。这是代码的简单版本:

import pyVars

def loop():
    newVar = int(input('New var: '))

    temp1 = newVar
    temp2 = pyVars.varA
    temp3 = pyVars.varB

    f = open('pyVars.py', 'w')
    f.close()

    f = open('pyVars.py', 'a')
    f.write('varA = ' + str(temp1) + '\n')
    f.write('varB = ' + str(temp2) + '\n')
    f.write('varC = ' + str(temp3) + '\n')
    f.close()

    f = open('pyVars.py')
    print(f.read())
    f.close()
    loop()

loop()
from pyVar import varA, varB, varC
我从同一文件夹中创建的另一个文件中获取变量:

varA = 0
varB = 0
varC = 0

只有瓦拉一直在变。如何修复此问题?

这很可能与import语句有关。当你写作时:

import pyVars
将varA=0、varB=0、varC=0作为pyVars变量的副本

无论您更改varA、varB、varC的值多少次,每当您尝试读取pyVars.varA、pyVars.varB时,它总是返回0,因为这是它导入的值。我初始设置varA=700,varB=800,varC=900并进行调试,在每个循环中,varA的初始值仍然是700。我通过更改代码来检查初始值:

import pyVars

def loop():
    newVar = int(input('New var: '))

    temp1 = newVar
    temp2 = pyVars.varA
    temp3 = pyVars.varB

    f = open('pyVars.py', 'w')
    f.close()

    f = open('pyVars.py', 'a')
    f.write('varA = ' + str(temp1) + '\n')
    f.write('varB = ' + str(temp2) + '\n')
    f.write('varC = ' + str(temp3) + '\n')
    f.close()

    f = open('pyVars.py')
    print(f.read())
    f.close()
    loop()

loop()
from pyVar import varA, varB, varC
调试时,varA始终返回700,即使在pyVars.py文件中varA的实际值不同

这也是为什么在pyVars.py文件上只更新varA的原因。A正在从用户处获取输入,但B和C被设置为A和B的值,它们被导入为0。因此,它们始终保持为0

这是我在修改代码30多分钟后的理解。我很乐意被人纠正,但无论如何,这对我来说是一个很好的问题/学习经历。谢谢大家!

编辑:所以我终于让它开始工作了。这与进口声明有关。由于要更改导入的源文件,如果需要使用新值,则需要重新加载该文件。请查看我更改的代码,该代码适用于我:

import importlib

def loop():
    import pyVars
    pyVars = importlib.reload(pyVars)
    newVar = int(input('New var: '))

    temp1 = newVar
    temp2 = pyVars.varA
    temp3 = pyVars.varB

    f = open('pyVars.py', 'w')
    f.close()

    f = open('pyVars.py', 'a')
    f.write('varA = ' + str(temp1) + '\n')
    f.write('varB = ' + str(temp2) + '\n')
    f.write('varC = ' + str(temp3) + '\n')
    f.close()

    f = open('pyVars.py')
    print(f.read())
    f.close()
    loop()

loop()

您可以使用Python巧妙的变量交换语法,如下所示:

import pyVars

def loop():    
    newVar = int(input('New var: '))   
    pyVars.varA, pyVars.varB, pyVars.varC = newVar, pyVars.varA, pyVars.varB    
    with open('pyVars.py', 'rb') as f:
        print(f.read())
    loop()

loop()

要更改
varB
varC
,您必须对
temp2
temp3
执行一些操作。事实上,你只是一遍又一遍地读写相同的值。我该怎么处理它们呢?我已经删除了对我答案的两次编辑,因为它们显然是不正确的。目前正在处理您的代码。@Wyxlor我不明白您想做什么。我现在看到了,并在下面的答案中发布了如何做。我已经用现在适合我的代码更新了答案。基本上,我已经将导入移动到循环中,并添加了一个重载,因此每次都使用更新的值。希望这能解决您的问题您可以使用变量交换语法更新所有变量。请看我的答案。我找到了另一种方法-使用importlib中的reload函数。它刷新库并更新变量。这正是我昨天在上面的代码中建议的:)只是好奇,为什么你以二进制读取方式打开文件而不是定期打开?老实说,这是习惯使然。但这是有原因的,特别是如果你想让你的代码跨平台工作(例如Linux、Windows)。医生们在这里谈到了这一点:这是否回答了你最初的问题?如果没有,请告诉我为什么没有。