我需要在Python中创建一个列表列表,所以我输入以下内容:
myList = [[1] * 4] * 3
Run Code Online (Sandbox Code Playgroud)
列表看起来像这样:
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)
然后我改变了最里面的一个值:
myList[0][0] = 5
Run Code Online (Sandbox Code Playgroud)
现在我的列表看起来像这样:
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)
这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?
我的问题的目的是通过Python加强我的知识库并更好地了解它,包括了解它的错误和意外.为了保持特定的内容,我只对CPython解释器感兴趣.
我正在寻找类似于从我的PHP地雷 问题中学到的东西,其中一些答案对我来说是众所周知的但是一对夫妇的边界恐怖.
更新:显然有一两个人感到不安,我问了一个已经在Stack Overflow之外部分回答的问题.这里的某些妥协是URL http://www.ferg.org/projects/python_gotchas.html
请注意,此处的一个或两个答案已经是上面引用的网站上的原始答案.
我是一位经验丰富的Perl开发人员,具有一定程度的经验和/或熟悉其他语言(C/C++的工作经验,Java和Scheme的学校经验,以及熟悉其他许多人).
我可能需要在Python中完成一些Web工作(最直接的,与Google App Engine相关).因此,我想问一下如何为那些来自Perl背景的人最好地学习Python提供很好的参考(例如,重点是两者之间的差异以及如何将perl idiomatics翻译成Python惯用语,而不是通用Python参考).以Web开发为中心的东西甚至更好.我会接受任何东西 - 文章,教程,书籍,示例应用程序?
谢谢!
我注意到以下几点:
class c:
def __init__(self, data=[]):
self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]
Run Code Online (Sandbox Code Playgroud)
这是正确的行为吗?
在我正在工作的大型应用程序中,有几个人以不同的方式导入相同的模块,例如导入x或从导入x导致x的副作用被导入两次,如果有人依赖于全局属性,可能会引入非常微妙的错误
例如,假设我有一个包mypakcage,包含三个文件mymodule.py,main.py和init .py
mymodule.py内容
l = []
class A(object): pass
Run Code Online (Sandbox Code Playgroud)
main.py内容
def add(x):
from mypackage import mymodule
mymodule.l.append(x)
print "updated list",mymodule.l
def get():
import mymodule
return mymodule.l
add(1)
print "lets check",get()
add(1)
print "lets check again",get()
Run Code Online (Sandbox Code Playgroud)
它打印
updated list [1]
lets check []
updated list [1, 1]
lets check again []
Run Code Online (Sandbox Code Playgroud)
因为现在在两个不同的模块中有两个列表,类似的A类是不同的对我来说它看起来很严重因为类本身将被区别对待,例如下面的代码打印False
def create():
from mypackage import mymodule
return mymodule.A()
def check(a):
import mymodule
return isinstance(a, mymodule.A)
print check(create())
Run Code Online (Sandbox Code Playgroud)
题:
有什么方法可以避免这种情况吗?除了强制执行该模块应该以单向onyl方式导入.这不能由python导入机制处理,我在django代码和其他地方也看到了与此相关的几个错误.
在我大胆地提交错误报告之前,我想我会在这里用更聪明的Pythonistas检查我的假设.我今天遇到了一个令人困惑的案例,所以我把它改成了一个玩具示例,如下所示:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
A little script to demonstrate that a function won't re-initialize its
list parameters between calls, but instead allows them to retain state.
"""
def bleedscope(a=[], b=[]):
"""
On each call, unless explicitly passed, both `a` and `b` should be
initialized as empty lists.
"""
c = a
if b:
c.extend(b)
return len(c)
x = bleedscope(b=[1])
print x # Should be 1, as expected.
x = bleedscope(b=[2])
print x # Expect also …Run Code Online (Sandbox Code Playgroud) 假设你有这样的东西:
class intlist:
def __init__(self,l = []):
self.l = l
def add(self,a):
self.l.append(a)
def appender(a):
obj = intlist()
obj.add(a)
print obj.l
if __name__ == "__main__":
for i in range(5):
appender(i)
Run Code Online (Sandbox Code Playgroud)
函数创建一个intlist实例,并在该新实例上调用该方法附加在实例属性l上.
为什么这段代码的输出是:
[0]
[0,1]
[0,1,2]
[0,1,2,3]
[0,1,2,3,4]
?如果我切换
obj = intlist()
Run Code Online (Sandbox Code Playgroud)
同
obj = intlist(l=[])
Run Code Online (Sandbox Code Playgroud)
我得到了所需的输出
[0]
[1]
[2]
[3]
[4]
为什么会这样?
谢谢
可能重复:
Python列表中的意外功能
我想在Python中列出一个列表,但显然这不起作用,因为更改一个数字会改变几个.为什么会这样,我该如何解决?
>>> a = [[0]*3]*4
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个Python/Twisted项目,该项目将在Planetlab上进行分发和测试.由于某些原因,我的代码在周五工作,现在我想测试一个小的改变,它拒绝工作:
Traceback (most recent call last):
File "acn_a4/src/node.py", line 6, in <module>
from twisted.internet.protocol import DatagramProtocol
File "/usr/lib/python2.5/site-packages/Twisted-10.0.0-py2.5-linux-i686.egg/twisted/__init__.py", line 18, in <module>
from twisted.python import compat
File "/usr/lib/python2.5/site-packages/Twisted-10.0.0-py2.5-linux-i686.egg/twisted/python/compat.py", line 146, in <module>
import operator
File "/home/cdecker/dev/acn/acn_a4/src/operator.py", line 7, in <module>
File "/home/cdecker/acn_a4/src/node.py", line 6, in <module>
from twisted.internet.protocol import DatagramProtocol
File "/usr/lib/python2.5/site-packages/Twisted-10.0.0-py2.5-linux-i686.egg/twisted/internet/protocol.py", line 20, in <module>
from twisted.python import log, failure, components
File "/usr/lib/python2.5/site-packages/Twisted-10.0.0-py2.5-linux-i686.egg/twisted/python/log.py", line 19, in <module>
from twisted.python import util, context, reflect
File "/usr/lib/python2.5/site-packages/Twisted-10.0.0-py2.5-linux-i686.egg/twisted/python/util.py", line 5, in <module> …Run Code Online (Sandbox Code Playgroud) python ×9
list ×2
attributes ×1
class ×1
instance ×1
mutable ×1
nested-lists ×1
perl ×1
scope ×1
twisted ×1