【问题标题】:python pass list as function parameterpython传递列表作为函数参数
【发布时间】:2012-04-03 16:23:27
【问题描述】:

各位,

下面代码的结果是[] 为什么不是 ['0','1','2']?如果我想让函数foo中的psswd等于数字,我该怎么办?

number = ['0','1','2']
def foo(psswd):
    psswd = number[:]

if __name__ == '__main__':
    psswd = []
    foo(psswd)
    print psswd

【问题讨论】:

    标签: python list function


    【解决方案1】:

    您需要使用slice-assigning 进行变异而不是重新绑定。

    psswd[:] = number[:]
    

    【讨论】:

      【解决方案2】:
      number = ['0','1','2']
      def foo(psswd):
          psswd[:] = number  # swap the slice around here
      
      if __name__ == '__main__':
          psswd = []
          foo(psswd)
          print psswd
      

      【讨论】:

        【解决方案3】:

        您的代码:

        number = ['0','1','2']
        def foo(psswd):
            psswd = number[:]
        
        if __name__ == '__main__':
            psswd = []
            foo(psswd)
            print psswd
        

        psswd = number[:] 用新列表重新绑定局部变量 psswd

        即,当您执行foo(psswd) 时,会调用函数foo,并在其中创建局部变量passwd,该变量指向同名的全局列表。

        当您在foo 函数中执行psswd = <something> 时,会创建/获取此<something> 并让本地名称psswd 指向它。全局变量psswd 仍然指向旧值。

        如果你想改变对象本身,而不是本地名称,你必须使用这个对象的方法。 psswd[:] = <smething>实际上调用了psswd.__setitem__方法,从而修改了本地名称psswd引用的对象。

        【讨论】:

          猜你喜欢
          • 2011-01-20
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 2012-03-07
          • 1970-01-01
          • 2023-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多