【问题标题】:Why can't I change a variable located in a .py file imported into a Jupyter notebook?为什么我不能更改导入到 Jupyter 笔记本中的 .py 文件中的变量?
【发布时间】:2020-06-13 16:36:51
【问题描述】:

假设我有一个文件 a.py:

a = 0

def give_a():  
    return a

然后我有一个带有以下两个单元格的 Jupyter 笔记本:

from a import *

.

a = 10  
print(give_a())

这会输出 0 而不是 10。

为什么它不输出 10,我该如何解决它?

【问题讨论】:

    标签: python jupyter-notebook python-import


    【解决方案1】:

    它不会输出 10,因为 a.py 中的 a 和 Jupyter 笔记本中的 a 是两个不同的变量。你应该看看 Python 中变量的作用域,例如 this chapter in an online textbook

    简而言之:

    a = 0
    
    def give_a():  
        return a  # refers to the variable a declared in the module
    
    a = 10  # is declared within the Jupyter notebook
    print(give_a())  # is a function in a.py
    

    【讨论】:

      【解决方案2】:

      当你说print(give_a()) 您只返回文件中定义的全局变量 a = 0 。它不知道 a = 10。相反,像这样将变量传递给您的函数

      def give_a(a):
          return a
      

      然后当你导入函数时,做

      print(give_a(10)) 
      

      【讨论】:

      • 这很好,但我必须更多地研究如何让它为我工作。在我的实际用例中,def give_a(): return a 被用作字典中的值。喜欢:dict_a = {'give_a' : give_a},这样我就可以用dict_a['give_a']() 调用它。再说一次,我想我可以使用dict_a['give_a'](a)。我会试试的,谢谢。
      【解决方案3】:

      这是因为在您的笔记本中a 引用了模块a.py,因此模块中的变量在您的笔记本中应称为a.a

      在某些情况下,最好使用 ipython 的 %run%load 命令将代码从 .py 文件导入笔记本。阅读关于这两个的文档,我相信你会开始将它们包含在你的笔记本中。它们可以在 ipython CLI 以及 Web 界面中使用。

      【讨论】:

      • 我会调查 %load。我有两个笔记本一起工作。第一个已经使用 %run 在第二个中使用信息。第二个需要第一个的一些信息,如果我使用 %run 将它们指向彼此,我会得到无限递归。这就是我将第一个笔记本中的一些代码作为模块导入第二个笔记本的原因。
      • 也许您可以将包含的代码分成更小的块以避免循环。我只使用import 来导入模块,除此之外我所做的只是%run -i 将代码从文件注入到笔记本或CLI 会话中。
      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2020-11-30
      相关资源
      最近更新 更多