首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python列表( [] )和[]

Python列表( [] )和[]
EN

Stack Overflow用户
提问于 2013-07-12 00:53:45
回答 4查看 823关注 0票数 9
代码语言:javascript
复制
from cs1graphics import *
from math import sqrt

numLinks = 50
restingLength = 20.0
totalSeparation = 630.0
elasticityConstant = 0.005
gravityConstant = 0.110
epsilon     = 0.001

def combine(A,B,C=(0,0)):
    return (A[0] + B[0] + C[0], A[1] + B[1] + C[1])

def calcForce(A,B):
    dX = (B[0] - A[0])
    dY = (B[1] - A[1])
    distance = sqrt(dX*dX+dY*dY)
    if distance > restingLength:
        stretch = distance - restingLength
        forceFactor = stretch * elasticityConstant
    else:
        forceFactor = 0
    return (forceFactor * dX, forceFactor * dY)                 #return a tuple


def drawChain(chainData, chainPath, theCanvas):
    for k in range(len(chainData)):
        chainPath.setPoint(Point(chainData[k][0], chainData[k][1]),k)
    theCanvas.refresh()                             #refresh canvas

chain = []                                                             #chain here
for k in range(numLinks + 1):
    X = totalSeparation * k / numLinks
    chain.append( (X,0.0) )

paper = Canvas(totalSeparation, totalSeparation)
paper.setAutoRefresh(False)
curve = Path()
for p in chain:
    curve.addPoint(Point(p[0], p[1]))
paper.add(curve)
graphicsCounter = 100

somethingMoved = True
while somethingMoved:
    somethingMoved = False
    oldChain = list(chain)                                             #oldChain here
    for k in range(1, numLinks):
        gravForce = (0, gravityConstant)
        leftForce = calcForce(oldChain[k], oldChain[k-1])
        rightForce = calcForce(oldChain[k], oldChain[k+1])
        adjust = combine(gravForce, leftForce, rightForce)
        if abs(adjust[0]) > epsilon or abs(adjust[1]) > epsilon:
            somethingMoved = True
        chain[k] = combine(oldChain[k], adjust)
    graphicsCounter -= 1
    if graphicsCounter == 0:
        drawChain(chain, curve, paper)
        graphicsCounter = 100

curve.setBorderWidth(2)
drawChain(chain, curve, paper)

我听说list([]) == []。那么,为什么要这样做呢?

oldChain = list(chain)代替oldChain = chain

这是同一件事,所以无论哪种方式都没有关系?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-12 00:55:48

list(chain)返回chain的浅层副本,它等效于chain[:]

如果您想要列表的浅层副本,那么可以使用list(),它有时也用于从迭代器中获取所有值。

y = list(x)y = x的区别

浅拷贝:

代码语言:javascript
复制
>>> x = [1,2,3]
>>> y = x         #this simply creates a new referece to the same list object
>>> y is x
True
>>> y.append(4)  # appending to y, will affect x as well
>>> x,y
([1, 2, 3, 4], [1, 2, 3, 4])   #both are changed

#shallow copy   
>>> x = [1,2,3] 
>>> y = list(x)                #y is a shallow copy of x
>>> x is y     
False
>>> y.append(4)                #appending to y won't affect x and vice-versa
>>> x,y
([1, 2, 3], [1, 2, 3, 4])      #x is still same 

深度拷贝:

请注意,如果x包含可变对象,则仅使用list()[:]是不够的:

代码语言:javascript
复制
>>> x = [[1,2],[3,4]]
>>> y = list(x)         #outer list is different
>>> x is y          
False

但是内部对象仍然是对x中对象的引用:

代码语言:javascript
复制
>>> x[0] is y[0], x[1] is y[1]  
(True, True)
>>> y[0].append('foo')     #modify an inner list
>>> x,y                    #changes can be seen in both lists
([[1, 2, 'foo'], [3, 4]], [[1, 2, 'foo'], [3, 4]])

由于外部列表是不同的,因此修改x不会影响y,反之亦然

代码语言:javascript
复制
>>> x.append('bar')
>>> x,y
([[1, 2, 'foo'], [3, 4], 'bar'], [[1, 2, 'foo'], [3, 4]])  

要处理此问题,请使用copy.deepcopy

票数 16
EN

Stack Overflow用户

发布于 2013-07-12 00:58:17

确实,list([])在功能上等同于[],两者都创建了一个新的空列表。

但是x = list(y)x = y是不一样的。前者创建一个浅层副本,后者创建一个对现有列表的新引用。

注意,list([])是低效的--它创建一个新的空列表(通过执行[]),然后复制它,产生另一个空列表(通过执行list(...)),然后释放原始的、未引用的列表。

票数 3
EN

Stack Overflow用户

发布于 2013-07-12 00:57:41

代码语言:javascript
复制
oldchain = list(chain)

oldchain指向一个不是链的新列表(不是同一个对象),但具有相同的内容。

*正如其他答案所提到的,这使得oldchain成为chain的“浅拷贝”。

代码语言:javascript
复制
oldchain = chain

旧链只指向链,两者都指向同一个对象

但是,请注意,oldchain = []oldchain = list()在功能上是相同的,因为它们都创建了一个空列表。当其他引用(即,chain)都参与其中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17599175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档