Python局部变量作为参考?

时间:2013-03-13 18:08:32

标签: python class variables

我正在尝试让我的小脚本工作,但我不知道问题是什么,其中一种方法会修改我的测试var,即使我不返回它,我的意思是,我想用它来工作本地而不是返回值。这不是我的实际代码,但你可以肯定代表它。

更新:我正在使用词典

    >>> 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}

3 个答案:

答案 0 :(得分:3)

您正在使用函数本地名称。在实例上设置属性(通过self)以在方法之间共享信息:

class check:
     def pathgen(self):
         self.test = 0
         print self.test
     def assign(self):
         self.test = 1
         self.pathgen()
         print self.test

答案 1 :(得分:1)

在您的代码中,'pathgen'将修改其第一个参数所指向的内容。 为避免这种情况,您可以在对其进行任何更改之前复制“test”

有关复制的更多信息:http://docs.python.org/2/library/copy.html

class check:
    def pathgen(self,test):
        local_copy = test.copy()
        local_copy['a'] = 0
        print local_copy

答案 2 :(得分:0)

你的假设是错误的。事实上,WILL PRINT 0行会打印1

请注意,如果test是列表,情况会有所不同,pathgen要修改它(例如,通过附加元素):

class check:
     def pathgen(self,test):
         test.append(1)
         print test
     def assign(self):
         test=[]
         self.pathgen(test)
         print test

check().assign()

事实上,这会打印[1]两次。

可以通过在test中复制pathgen来解决此问题:

class check:
     def pathgen(self,test):
         test=test[:]    # make a shallow copy of `test'
         test.append(1)
         print test
     def assign(self):
         test=[]
         self.pathgen(test)
         print test

check().assign()