我的問題很簡單,但我無法解決。當我將物件插入串列時,每當我更改其中一個物件時,串列中的元素都會更改(我認為它們都指向記憶體中的同一個物件)。我想取消鏈接它們,這樣串列中就不會充滿具有相同值的完全相同的物件。例如,避免鏈接或可變性。我認為問題在于我如何初始化物件,但我不確定如何解決。這是我的代碼。
from typing import List, Tuple
class State:
#think of State as some kind of coordinates
def __init__(self, z:float, angle:float):
self.z = z
self.angle = angle
class ListOfStates:
#this should be an object with a list containing DIFFERENT (unlinked) State objects
def __init__(self, list_of_states : List[State]):
self.list_of_states = list_of_states
class StateSettings:
#a bigger object to encapsulate previous objects
def __init__(self, state : State, list_of_states : ListOfStates):
self.state = state
self.list_of_states = list_of_states
some_number = 42
# my try #1
state_settings = StateSettings
#create a list of State objects to be used later
state_settings.list_of_states = [State for i in range(some_number)]
state_settings.state = State
for i in range(some_number):
state_settings.list_of_states[i].angle = i
并且 state_settings.list_of_states 包含物件的相同副本 42 次,例如
print(state_settings.list_of_states[0].angle)
print(state_settings.list_of_states[1].angle)
print(state_settings.list_of_states[2].angle)
印刷
41
41
41
我也嘗試了不同的初始化方法,但沒有運氣。
# my try #2
state_settings = StateSettings(
state = State(
z = 0,
angle = 0),
list_of_states = [State for i in range(some_number)]
)
for i in range(some_number):
state_settings.list_of_states[i].angle = i
或者
# my try 3
from copy import deepcopy
state_settings = StateSettings
state_settings.list_of_states = [deepcopy(State) for i in range(some_number)]
state_settings.state = deepcopy(State)
for i in range(some_number):
state_settings.list_of_states[i].angle = i
My question, as far as I know, is not solved by answers such as Changing a single object within an array of objects changes all, even in a different array or List of Objects changes when the object that was input in the append() function changes.
uj5u.com熱心網友回復:
您在代碼中犯了一些基本錯誤。讓我先嘗試使用您的代碼行來闡明這些
# my try #1
state_settings = StateSettings
您在上一行中所做的是,將類 StateSettings 分配給 state_settings 變數。您從未在此處創建過物件。
#create a list of State objects to be used later
state_settings.list_of_states = [State for i in range(some_number)]
你在這里所做的也是一樣的,創建了一個 State 類參考串列,而不是物件。因此,串列中的所有值都是相同的。
state_settings.state = State
您在這里所做的是將屬性 state 設定為 StateSettings class ,而不是物件。
for i in range(some_number):
state_settings.list_of_states[i].angle = i
你在這里做了什么,設定一個屬性角度類狀態。由于串列中的所有值都是相同的 State 參考,因此任何地方的值都相同
總結上述問題,
當您為類名分配屬性時,屬性會添加到類本身。您參考該類的任何地方都將具有相同的屬性值。當您創建一個物件然后在該物件上設定一個屬性時,該屬性僅位于該物件中。它不會反映在創建的其他物件上。
您撰寫的代碼的簡單更新如下,我想它可以像您想要的那樣作業。
from typing import List
class State:
# think of State as some kind of coordinates
# Use default values, so you dont need to provide a value in init
def __init__(self, z: float = None, angle: float = None):
self.z = z
self.angle = angle
class ListOfStates:
# this should be an object with a list containing DIFFERENT (unlinked) State objects
# Use default values, so you dont need to provide a value in init
def __init__(self, list_of_states: List[State] = None):
self.list_of_states = list_of_states
class StateSettings:
# a bigger object to encapsulate previous objects
# Use default values, so you dont need to provide a value in init
def __init__(self, state: State = None, list_of_states: ListOfStates = None):
self.state = state
self.list_of_states = list_of_states
some_number = 42
# my try #1
state_settings = StateSettings()
# create a list of State objects to be used later
state_settings.list_of_states = [State() for i in range(some_number)]
state_settings.state = State()
for i in range(some_number):
state_settings.list_of_states[i].angle = i
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/357903.html
