Python清单([])和[]

发布于 2021-01-29 18:33:25

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

这是同一件事,所以两种方法都没关系吗?

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    如果您想要列表的浅表副本,请使用list(),它有时还用于从迭代器获取所有值。

    y = list(x)和之间的区别y = x


    浅拷贝:

    >>> 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()[:]不足:

    >>> x = [[1,2],[3,4]]
    >>> y = list(x)         #outer list is different
    >>> x is y          
    False
    

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

    >>> 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,反之亦然

    >>> x.append('bar')
    >>> x,y
    ([[1, 2, 'foo'], [3, 4], 'bar'], [[1, 2, 'foo'], [3, 4]])
    

    为了处理这个使用copy.deepcopy



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看