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)
I was told that list([]) == []
. So why is this code doingoldChain = list(chain)
instead of oldChain = chain
it's the same thing so it does not matter either way to do it?
In practical terms there's no difference. I'd expect [] to be faster, because it does not involve a global lookup followed by a function call. Other than that, it's the same.
A list is an ordered and mutable Python container, being one of the most common data structures in Python. To create a list, the elements are placed inside square brackets ([]), separated by commas.
What Is an Array in Python? An array is also a data structure that stores a collection of items. Like lists, arrays are ordered, mutable, enclosed in square brackets, and able to store non-unique items.
🔹 In Summary. You can create an empty list using an empty pair of square brackets [] or the type constructor list() , a built-in function that creates an empty list when no arguments are passed.
list(chain)
returns a shallow copy of chain
, it is equivalent to chain[:]
.
If you want a shallow copy of the list then use list()
, it also used sometimes to get all the values from an iterator.
Difference between y = list(x)
and y = x
:
Shallow copy:
>>> 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
Deepcopy:
Note that if x
contains mutable objects then just list()
or [:]
are not enough:
>>> x = [[1,2],[3,4]]
>>> y = list(x) #outer list is different
>>> x is y
False
But inner objects are still references to the objects in 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]])
As the outer lists are different then modifying x will not affect y and vice-versa
>>> x.append('bar')
>>> x,y
([[1, 2, 'foo'], [3, 4], 'bar'], [[1, 2, 'foo'], [3, 4]])
To handle this use copy.deepcopy
.
It is true that list([])
is functionally equivalent to []
, both creating a new empty list.
But x = list(y)
is not the same as x = y
. The formers makes a shallow copy, and the latter creates a new reference to the existing list.
Note that list([])
is inefficient -- it creates a new empty list (by doing []
), then copies it, resulting with another empty list (by doing list(...)
), then deallocates the original, unreferenced, list.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With