Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 - Fatal编程技术网

将行为与python导入混淆

将行为与python导入混淆,python,Python,你好 我有两个文件: a、 py: b、 py: 我不明白为什么有两个不同的变量,应该是相同的 如果我将“main”块移动到另一个文件,那么一切都会正常工作,即只有一个VAR c、 py: 所以我的问题是: 为什么a.py的最后两行打印不同的结果? 他们不是在a.py中打印相同的VAR变量吗? 顺便说一句,我正在win7上使用python 2.7 谢谢。你可能想仔细阅读一下?引述: 如果在函数体中的任何位置为变量指定了新值,则假定该变量为局部变量。如果在函数中为变量分配了一个新值,则该变量是隐式

你好

我有两个文件:

a、 py:

b、 py:

我不明白为什么有两个不同的变量,应该是相同的

如果我将“main”块移动到另一个文件,那么一切都会正常工作,即只有一个VAR

c、 py:

所以我的问题是: 为什么a.py的最后两行打印不同的结果?
他们不是在a.py中打印相同的VAR变量吗? 顺便说一句,我正在win7上使用python 2.7


谢谢。

你可能想仔细阅读一下?引述:

如果在函数体中的任何位置为变量指定了新值,则假定该变量为局部变量。如果在函数中为变量分配了一个新值,则该变量是隐式局部变量,您需要显式地将其声明为“全局”

编辑:为了详细说明,下面是发生的情况(为了清楚起见,省略
c.py
):

  • 执行文件
    a.py
  • 导入文件
    b.py
    ,然后再次导入
    a.py
  • 通过b的导入,
    VAR
    在中定义,值为1。这就结束了b的进口
  • a.py
    中的
    \uuuuuu main\uuuuu
    部分在其自己的范围内执行
    VAR
    被设置为-1,并且运行
    p()
    :这显示-1,因为
    VAR
    刚刚被设置为
  • 然后执行
    b.p()
    ,然后运行
    a.p()
    。因为从
    b.py
    (不同范围)的角度来看,
    VAR
    的值仍然是1,所以print语句只输出1

  • 您还将注意到,这两个print语句中的id是不同的:这是因为
    VAR
    位于不同的范围内,并且没有以任何方式连接它们被断开连接,因为
    \uuuu main\uuu
    位于不同的匿名作用域中:Python解释器执行的作用域。这在.Hi,jro中进行了简要讨论。我没有在函数中做任何赋值。所有的p()函数都只打印相同的变量VAR(在我看来),但结果是两个不同的变量,因为它们没有相同的地址,甚至没有相同的值。那么为什么
    c.py
    中只有一个
    VAR
    ?为什么b.py在
    a.py
    情况下有自己的VAR,而在
    c.py
    情况下没有?
    print('in a')
    import b
    
    print('var')
    VAR = 1
    
    def p():
        print('{}, {}'.format(VAR, id(VAR)))
    
    if __name__ == '__main__':
        VAR = -1
        p()
        b.p() # Where does this VAR come from?
    
    print('in b')
    import a
    
    def p():
        a.p()
    
    import a
    import b
    
    if __name__ == '__main__':
        a.VAR = -1
        a.p()
        b.p()