我想制作一个数组的副本,以便就地修改副本,而不会影响原始数据。此代码失败
a = [
'462664',
'669722',
'297288',
'796928',
'584497',
'357431'
]
b = a.clone
b.object_id == a.object_id # => false
a[1][2] = 'X'
a[1] #66X722
b[1] #66X722
副本应该与对象不同。为什么它只是一个参考?
答案 0 :(得分:11)
您需要对阵列进行深层复制。
以下是这样做的方法
Marshal.load(Marshal.dump(a))
这是因为您正在克隆数组而不是内部元素。因此数组对象是不同的,但它包含的元素是相同的实例。例如,你可以为你的案件做a.each{|e| b << e.dup}
答案 1 :(得分:7)
您可以使用clone
在每个数组元素上调用map
,而不是在数组本身上调用b = a.map(&:clone)
:
>>> from course.models import Course
>>> course = Course.objects.get(pk=1)
>>> course.title
'test'
>>> course.title = "NameChange"
>>> course.title
'NameChange'
>>> course.save()
>>>
这适用于问题中所述的示例,因为您为数组中的每个元素获取了一个新实例。
答案 2 :(得分:6)
试试这个:
b = [] #create a new array
b.replace(a) #replace the content of array b with the content from array a
此时,这两个数组是对不同对象的引用,内容是相同的。
答案 3 :(得分:3)
您可以只映射数组的元素。我相信这是迄今为止最干净的解决方案。
array.map(&:itself)
答案 4 :(得分:2)
您可以使用#dup创建对象的浅表副本,这意味着“对象的实例变量被复制,但它们引用的对象未被复制”。 例如:
sep = ""
答案 5 :(得分:-1)
不确定,如果在其他任何地方都有答案。尝试搜索但没有成功。
试试这个
current_array =["a", "b","c","d"]
new_array = current_array[0 .. current_array.length]
new_array[0] ="cool"
output of new_array
"cool","b","c","d"
希望这有帮助。