【问题标题】:Python dict as local, not referencePython dict 作为本地,而不是参考
【发布时间】:2013-03-01 21:13:51
【问题描述】:

我正在尝试让我的小脚本正常工作,但我不知道问题出在哪里。

其中一种方法会修改我的测试dictvar,即使我不返回它。我的意思是,我想在本地使用它而不是返回值。这不是我的实际代码,但您可以确定它具有代表性。

>>> class check:
...   def pathgen(self,test):
...     test['a']=0
...     print test
...   def assign(self):
...     test={'a':1}
...     self.pathgen(test)
...     print test #WILL PRINT 0
... 
>>> a=check()
>>> a.assign()
{'a': 0}
{'a': 0}

【问题讨论】:

  • 没错。传递的字典对象是 mutated - 这是因为 Python 是 Call By (Object) Sharing。添加另一个键 'hello': 'world!' 并且不要pathgen 中更改它。结果如何?如果您想修改 pathgen 中的字典,请创建一个 new 字典对象,它是原始字典的 副本 并使用它。
  • @pst 我以前没听说过“通过共享调用”这个词,很有趣。
  • 将相同的打印两次。那我就不能在我的项目中使用 dict 了!
  • 另一个术语是call by assignment
  • @wRAR 我更喜欢使用它来避免与“按引用传递”/“按值传递[引用]”的歧义,这可以理解为完全不同的事物(或相同的事物)事物)跨越不同的语言。这只是一件不太容易处理的事情,它也适合用于描述 JavaScript 等不使用“引用”来讨论调用约定或实现规范的语言中的相同行为。谈论一种语言的工作原理是一回事,谈论它的实际实现方式是另一回事。

标签: python class dictionary


【解决方案1】:

如果您希望对对象的更改对于更改它的函数来说是本地的,您需要复制该对象。您可以在调用时复制字典:

self.pathgen(dict(test))

或在被调用者内复制。

def pathgen(self, test):
    test = dict(test)
    ...

【讨论】:

  • 请注意,这将生成浅拷贝。字典中包含的对象仍可能被修改。也看看copy module
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多