2012-03-30 12 views
6

तो यही वह है जो मैंने करने की कोशिश की।पायथन में सूची की प्रतिलिपि: गहरी बनाम उथली प्रतिलिपि: पाइथन में मेरे लिए गोचा?

vectorized=[0,0,0,0] 

अब, शब्दकोश के सूचकांक (जो लंबाई की भी है पर निर्भर करता है:

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

तो मैं क्या उम्मीद कर रही थी, उदाहरण के लिए था लंबाई 4. तो मैं बनाने एक 4 आयाम वेक्टर है इस मामले में 4) जबकि बाकी शून्य

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

है मान 1 के साथ एक वेक्टर बनाने अब बजाय क्या हो रहा है यह है:

+०१२३५१६४१०
vector = [1,0,0,0],[1,1,0,0] .. and finally [1,1,1,1] 
भी vectorized

अब

[1,1,1,1] 

क्या गलत मैं कर रहा हूँ है। और मैं जो हासिल करना चाहता हूं उसे कैसे प्राप्त करूं। मूल रूप से मैं इकाई वैक्टर बनाने की कोशिश कर रहा हूं। धन्यवाद

+0

मेरी इच्छा है कि यह गुणवत्ता अधिक गुणवत्ता हो। +1। मैं केवल शीर्षक सुधारने की सिफारिश करता हूं। – Trufa

+1

@ ट्राफा: संपादित :) – Fraz

उत्तर

9

इस लाइन (इन पंक्तियों, वास्तव में):

vector = vectorized 

प्रतियां सूची संदर्भ। आपको अनुक्रम सामग्री की एक उथली प्रतिलिपि करने की आवश्यकता है।

vector = vectorized[:] 
5

आप एक सूची बना रहे हैं और फिर इसे कई अलग-अलग नाम दे रहे हैं। याद रखें कि ए = बी एक नई वस्तु नहीं बनाता है। इसका मतलब यह है कि ए और बी दोनों एक ही चीज़ के लिए नाम हैं।

ऐसा करें:

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

लाइन

vector = vectorized 

vectorized की एक प्रति नहीं कर रहा है। तब भी जब आप vector बदलते हैं, तो आप 'वेक्टरकृत भी बदल रहे हैं।

आप पहली पंक्ति को बदल सकते हैं:

vector = vectorized[:] 

या

import copy 
vector = copy.copy(vectorized) 

आप एक प्रति बनाना चाहते हैं।

2

पाइथन में रहते समय, जब आप किसी नई सूची में एक सूची निर्दिष्ट करते हैं, तो नई सूची केवल एक ब्रांड के बजाय एक सूचक है।

तो जब आप "वेक्टर" के मान को संशोधित करने का प्रयास करते हैं, तो आप वास्तव में "वेक्टरकृत" के मान को बदल रहे हैं। और अपने मामले में, vector[i] = 1 रूप vectorized[i] = 1

1

आपका समस्या यह है कि जब आप vector = vectorized बारे में यह सरणी की एक प्रतिलिपि नहीं बना रहा है, बल्कि यह दोनों के बीच एक बंधन पैदा कर रही है है एक ही है।

पायथन में असाइनमेंट स्टेटमेंट ऑब्जेक्ट्स कॉपी नहीं करते हैं, वे एक लक्ष्य और ऑब्जेक्ट के बीच बाइंडिंग बनाते हैं।

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

यह मदद करनी चाहिए आप इसे हल मिलता है।

और यहां आपको पाइथन आरईपीएल से थोड़ा सा स्निपेट है जो आपको दिखाता है कि मेरा क्या मतलब है।

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

संपादित करें: जीज़ आप लोग तेज़ हैं!

संबंधित मुद्दे