【问题标题】:running functions via import in python在python中通过导入运行函数
【发布时间】:2017-05-18 05:10:09
【问题描述】:

我有以下脚本:

第一个是test1.py

x = 1

def test():

    globx = x
    print(globx)
    globx += 1
    return globx

x = test()

第二个是test2.py

import test1

z=3
while z != 0:
    if __name__=='__main__':
        test1.test()
        z -= 1
    else: 
        pass

我正在使用这些来学习和玩从其他脚本调用函数,我想要的是输出:

1
2
3

但我明白了:

1
2
2
2

当我更换

    globx = x
    print(globx)
    globx += 1
    return globx

x = test()

test1.py

global x 
print(x) 
x += 1

我确实得到了想要的结果,但显然你不应该使用全局变量,所以我想改掉这个习惯。

我有 2 个问题。

  1. 为什么我得到错误的输出和
  2. 当我使用globx = x 版本的test1.py 而不是3 个时,为什么会有4 个输出?

【问题讨论】:

    标签: python function python-import


    【解决方案1】:

    当你import test1 时,整个脚本都会被执行。第一次调用函数test()。它打印 1 并将 x 更改为 2。然后在循环中调用 test1.test() 三次。 globx 是一个局部变量。打印了3次(2),改了3次为3,但是没有保存。

    【讨论】:

      【解决方案2】:

      为什么我会得到错误的输出?

      当你导入test1第一次运行时,第一次执行test并将其分配给x,打印1并递增x

      然后你在test2中再执行3次test,但没有更新x,所以test将设置globxx,打印x并更新globx,然后离开x 原封不动(停留在 2)。

      为什么有 4 个输出?

      您将z 设置为3,然后计数为0z = 3, 2, 1, 0 OVER!。因此,您执行z = 1..3,导致加载时在test1 自身内部执行的时间是 + 的 3 倍。

      如何解决?

      test1.py:

      对所有操作使用全局x。不要跑test

      x = 1
      
      def test():
          global x
          print(x)
          x += 1
      

      开启test2.py

      使用range 迭代 3 次。如果模块由另一个模块运行,您的 else: pass 将触发无限循环:

      import test1
      
      if __name__ == '__main__':
          for _ in range(3):
              test1.test()
      

      【讨论】:

      • 谢谢,这很好,但我希望避免使用global
      • 您可以使用生成器,但这会更复杂。如果没有全局变量,您还想过如何保持当前值?
      • 使用return globx,然后设置x = test()
      • 只有在每次调用 test (test1.x = test1.test()) 时手动设置 x 才有效,而且从技术上讲,x 仍然是一个全局变量。
      • 啊,我明白了。有没有办法通过使用input() 发送x 或任何其他变量,或者只是将其设置为test1test2
      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多