2012-03-30 49 views
6

Vì vậy, đây là những gì tôi đã cố gắng làm.Sao chép danh sách trong python: sâu vs nông bản sao: gotcha cho tôi trong python?

vectorized = [0] * length 
for i,key in enumerate(foo_dict.keys()): 
    vector = vectorized 
    vector[i] = 1 
    print vector 
    vector = vectorized 
print vectorized 

Vì vậy, những gì tôi đã hy vọng là ví dụ chiều dài là 4. Vì vậy, tôi tạo ra một vector 4 chiều:

vectorized=[0,0,0,0] 

bây giờ, tùy thuộc vào chỉ số của từ điển (mà cũng là chiều dài 4 trong trường hợp này) tạo ra một vector với giá trị 1 trong khi phần còn lại có zero

so vector = [1, 0,0,0] , [0,1,0,0] and so on.. 

Bây giờ thay vì những gì đang xảy ra là:

vector = [1,0,0,0],[1,1,0,0] .. and finally [1,1,1,1] 

thậm chí vector hóa tại là

[1,1,1,1] 

Whats sai tôi đang làm. và làm cách nào để đạt được những gì tôi muốn đạt được. Về cơ bản, tôi đang cố gắng tạo các vectơ đơn vị. Cảm ơn

+0

Tôi muốn có thêm câu hỏi là chất lượng này. +1. Tôi chỉ khuyên bạn nên cải thiện tiêu đề. – Trufa

+1

@Trufa: Đã chỉnh sửa :) – Fraz

Trả lời

9

Dòng này (những dòng này, thực sự):

vector = vectorized 

bản sao tài liệu tham khảo danh sách. Bạn cần phải làm một bản sao nông của các nội dung chuỗi.

vector = vectorized[:] 
5

Bạn đang tạo một danh sách và sau đó đặt tên cho một số tên khác nhau. Hãy nhớ rằng a = b không tạo ra một đối tượng mới. Nó chỉ có nghĩa là a và b là cả hai tên cho cùng một thứ.

Hãy thử điều này thay vì:

for ...: 
    vector = [0] * length 
    ... 
4

Dòng

vector = vectorized 

không được thực hiện một bản sao của vectorized. Bất cứ lúc nào bạn thay đổi vector từ đó trở đi, bạn cũng đang thay đổi `vectơ hóa.

Bạn có thể thay đổi dòng đầu tiên:

vector = vectorized[:] 

hoặc

import copy 
vector = copy.copy(vectorized) 

Nếu bạn muốn tạo một bản sao.

2

Trong khi bằng Python, khi bạn gán một danh sách vào danh sách mới, danh sách mới chỉ là một con trỏ thay vì một con trỏ mới.

Vì vậy, khi bạn cố gắng sửa đổi giá trị của "vectơ", bạn thực sự đang thay đổi giá trị của "vectơ". Và trong trường hợp của bạn, vector[i] = 1 là giống như vectorized[i] = 1

1

Vấn đề của bạn là khi bạn viết vector = vectorized nó không tạo ra một bản sao của mảng, chứ không phải nó đang tạo ra một ràng buộc giữa hai người.

Báo cáo chuyển nhượng bằng Python không sao chép đối tượng, chúng tạo liên kết giữa mục tiêu và đối tượng.

http://docs.python.org/library/copy.html

Điều này sẽ giúp bạn nhận được nó được sắp xếp ra ngoài.

Và đây là một đoạn trích nhỏ từ REPL trăn để cho bạn biết ý tôi là gì.

>>> vectorized = [0] * 4 
>>> print vectorized 
[0, 0, 0, 0] 
>>> vector = vectorized 
>>> vector[1] = 1 
>>> print vectorized 
[0, 1, 0, 0] 

EDIT: Jeez các bạn nhanh quá!

Các vấn đề liên quan