在赋值之前引用了Python局部变量“”

2024-10-01 04:58:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在想办法解决我遇到的一些问题。 我已经为这里的例子编写了一个小程序(我将在实际的例子中实现这个解决方案:)

所以, 我有3个文件 一个-这是主要的 测试-这是我运行的测试 CounterTest-其中包含def类

一:

def main():
    CounterTest=1
    execfile("c:\\111\\Test.py") 
if __name__ == '__main__':

    main()

测试:

^{pr2}$

反测试:

class CounterTest1():
   def CounterPlus(self):
        CounterTest +=1
        print CounterTest

场景: 我运行“one”来执行文件测试(所有这些都发生在main def中) 在“Test”中,我调用class和def-在def中,我们计数器+1,这是在“one”文件中定义的。在

我得到“赋值前引用的局部变量'CounterTest'”

我什么都试过了,但没用

认可

谢谢


Tags: 文件namepytest程序ifmaindef
1条回答
网友
1楼 · 发布于 2024-10-01 04:58:52

总之,你不能。如果我正确理解你的过程,你就是:

1。正在运行main.py
2在函数内部定义变量,使其非全局变量

def main():
    CounterTest = 1  # <  right here

3。从其他文件执行代码

^{pr2}$

4。它会导入第三个文件

from CounterTest import *

5。它试图修改第一个文件中的全局

...
    CounterTest += 1

你不能那样做。你还差三个级别的“不”。在

  1. main.pyCounterTest不是全局的,所以它只在def main的作用域内可用。在
  2. 即使是全局的,test.py在没有显式传递的情况下也不能访问main.py的全局变量。在
  3. 即使您显式地传递了它们(使用execfile(path, globals_dict, locals_dict)),并且它们在test.py中变成了全局变量,CounterTest.py也不允许看到{}的全局变量。在

你甚至不能为了让事情好起来而胡闹。你需要参数化值,你需要停止使用全局变量。整个过程应该是:

# counter.py
class Counter(object):
    """Counter is knows how to add to itself"""
    def __init__(self, value=1):
        self.__value = value
    def increment(self):
        self.__value += 1
    @property
    def value(self):
        return self.__value


# main.py

import counter

c = counter.Counter()  # initializes at 1

print(c.value)  # 1
c.increment()
print(c.value)  # 2

# now SHARE that instance of c!!

相关问题 更多 >