<small id='meT12'></small><noframes id='meT12'>

    <bdo id='meT12'></bdo><ul id='meT12'></ul>
  • <tfoot id='meT12'></tfoot>

  • <legend id='meT12'><style id='meT12'><dir id='meT12'><q id='meT12'></q></dir></style></legend>
    1. <i id='meT12'><tr id='meT12'><dt id='meT12'><q id='meT12'><span id='meT12'><b id='meT12'><form id='meT12'><ins id='meT12'></ins><ul id='meT12'></ul><sub id='meT12'></sub></form><legend id='meT12'></legend><bdo id='meT12'><pre id='meT12'><center id='meT12'></center></pre></bdo></b><th id='meT12'></th></span></q></dt></tr></i><div id='meT12'><tfoot id='meT12'></tfoot><dl id='meT12'><fieldset id='meT12'></fieldset></dl></div>
      1. 从模块导入的全局变量没有更新-为什么?

        时间:2024-08-21
          <bdo id='H9xRE'></bdo><ul id='H9xRE'></ul>
          1. <tfoot id='H9xRE'></tfoot>

              <i id='H9xRE'><tr id='H9xRE'><dt id='H9xRE'><q id='H9xRE'><span id='H9xRE'><b id='H9xRE'><form id='H9xRE'><ins id='H9xRE'></ins><ul id='H9xRE'></ul><sub id='H9xRE'></sub></form><legend id='H9xRE'></legend><bdo id='H9xRE'><pre id='H9xRE'><center id='H9xRE'></center></pre></bdo></b><th id='H9xRE'></th></span></q></dt></tr></i><div id='H9xRE'><tfoot id='H9xRE'></tfoot><dl id='H9xRE'><fieldset id='H9xRE'></fieldset></dl></div>

            1. <legend id='H9xRE'><style id='H9xRE'><dir id='H9xRE'><q id='H9xRE'></q></dir></style></legend>
                    <tbody id='H9xRE'></tbody>

                  <small id='H9xRE'></small><noframes id='H9xRE'>

                  本文介绍了从模块导入的全局变量没有更新-为什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我很难理解为什么使用import时从另一个模块导入全局变量会按预期工作,但使用from x import *时全局变量似乎不会在其自己的模块内更新

                  假设我有2个文件, one.py:

                  def change(value):
                          global x
                          x = value
                  
                  x = "start"
                  

                  和Two.py:

                  from one import *
                  print x
                  change("updated")
                  print x
                  

                  我期望:

                  start
                  updated
                  

                  但是我得到.

                  start
                  start
                  

                  如果我正常导入模块,它会按预期工作

                  import one
                  print one.x
                  one.change("updated")
                  print one.x
                  

                  结果.

                  start
                  updated
                  

                  鉴于我不能更改ony.py对全局变量的使用(不是我的错),而two.py应该是一种围绕one.py的包装器*,为了一个顽固的变量,我真的希望避免在two.py中使用one.命名空间。

                  如果不可能,对正在发生的事情进行新手级别的解释可能会帮助我避免再次陷入这样的困境。我知道one.x正在更新,但是two.x不支持这些更新,但我不知道为什么。

                  推荐答案

                  您可以将包视为词典。包中的每个函数和变量都作为该字典中的一个键列出,您可以使用globals()查看。

                  从另一个包导入对象时,您会将对该对象的引用复制到您自己的包中,并使用一个名称(如果import <var> as <name>,通常相同,如果您import <var> as <name>则不同)。

                  通过设置另一个包中的值,您可以用新值覆盖该包中的键,但您的引用将指向旧的引用。

                  与DICTS的类比

                  我们可以用DICT作为类比来演示这个过程:

                  # Our 'packages'
                  one = {'x': 'start'}
                  two = {}
                  
                  # Equivalent of our import
                  two['x'] = one['x']   
                  
                  # Variable updated in `one'
                  one['x'] = 'updated'
                  
                  # ... and accessed in `two`
                  print(two['x'])   # Still 'start'
                  

                  我们不会因为覆盖了one中的值而期望更新two字典。

                  您可以为此做些什么

                  只要不通过覆盖变量而中断指针,就可以修改对象。例如,如果x是字典,您可以更改字典内的值,两个变量仍将指向同一对象。

                  或者,您也可以将变量附加到函数,如下所示:

                  def change(value):
                      change.x = value
                  

                  这通过确保我们变异的是同一对象来完成相同的工作。

                  如果这两个项目需要一起旅行,则更好的答案可能是将这两个项目包装在一个对象中:

                  class Changer:
                      x = 'start'
                  
                      @classmethod
                      def change(cls, value):
                          cls.x = value
                  

                  但是,此时我们可以将该值直接修改为属性:

                  Changer.x = 'updated'
                  

                  哪个可能是最简单的。

                  这篇关于从模块导入的全局变量没有更新-为什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:为函数中的全局变量赋值时,为什么在赋值&quot;之前引用了&quot;错误? 下一篇:如何在Python中确定作用域

                  相关文章

                    <legend id='xZex4'><style id='xZex4'><dir id='xZex4'><q id='xZex4'></q></dir></style></legend>

                    <small id='xZex4'></small><noframes id='xZex4'>

                  1. <i id='xZex4'><tr id='xZex4'><dt id='xZex4'><q id='xZex4'><span id='xZex4'><b id='xZex4'><form id='xZex4'><ins id='xZex4'></ins><ul id='xZex4'></ul><sub id='xZex4'></sub></form><legend id='xZex4'></legend><bdo id='xZex4'><pre id='xZex4'><center id='xZex4'></center></pre></bdo></b><th id='xZex4'></th></span></q></dt></tr></i><div id='xZex4'><tfoot id='xZex4'></tfoot><dl id='xZex4'><fieldset id='xZex4'></fieldset></dl></div>

                    <tfoot id='xZex4'></tfoot>
                    • <bdo id='xZex4'></bdo><ul id='xZex4'></ul>