Python (Jupyter) назначение «равно» создает изменения в переменной RHS вниз по течению - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь следующий код в Python, используя Jupyter Notebooks:

import numpy as np

i=2
j=0

basis = np.matrix([False,False,True,True,True])
basis_mod = basis
print "basis"
print basis
print "basis_mod"
print basis_mod

basis_mod[:,i] = False
print "basis"
print basis
print "basis_mod"
print basis_mod

basis_mod[:,j] = True
print "basis"
print basis
print "basis_mod"
print basis_mod

Вывод на консоль / что напечатано:

basis
[[False False  True  True  True]]
basis_mod
[[False False  True  True  True]]
basis
[[False False False  True  True]]
basis_mod
[[False False False  True  True]]
basis
[[ True False False  True  True]]
basis_mod
[[ True False False  True  True]] 

Мой вопрос: почему переменнаяизменение базы, когда я делаю изменения в base_modified?Чтобы было ясно, я изменяю переменную base_mod, поэтому я ожидаю, что базовая переменная не изменится.Однако, когда я печатаю базовую переменную, она меняется на переменную base_mod.

Обратите внимание, что если я изменю код на:

import numpy as np

i=2
j=0

basis = np.matrix([False,False,True,True,True])
basis_mod = np.matrix([False,False,True,True,True])
print "basis"
print basis
print "basis_mod"
print basis_mod

basis_mod[:,i] = False
print "basis"
print basis
print "basis_mod"
print basis_mod

basis_mod[:,j] = True
print "basis"
print basis
print "basis_mod"
print basis_mod

Распечаткакак и ожидалось:

basis
[[False False  True  True  True]]
basis_mod
[[False False  True  True  True]]
basis
[[False False  True  True  True]]
basis_mod
[[False False False  True  True]]
basis
[[False False  True  True  True]]
basis_mod
[[ True False False  True  True]]

Поэтому я подозреваю, что проблема связана со строкой Base_MOD = БД, но я не понимаю, почему.

Любая помощь очень ценится!Это в основном портит алгоритм, который я пытаюсь кодировать.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

В python, когда вы пишете a=b, вы фактически ссылаетесь на переменную b на переменную a, и если вы вносите изменения в любую из переменных, эти изменения автоматически применяются к другой переменной.На самом деле они станут идентичными с разными именами

a is b will output True
0 голосов
/ 26 апреля 2018

Когда вы имеете дело с массивами или списками (любая изменяемая структура данных в этом отношении), вы фактически сохраняете ссылку на эту переменную.

Если вы хотите, чтобы ваш basis не изменился, вам нужносоздайте копию basis и сохраните ее в basis_mod.

>>> import numpy

>>> basis = numpy.matrix([1, 2])
>>> basis_mod = basis
>>> basis_mod[0] = [3, 4]

>>> basis
matrix([[3, 4]])
>>> basis_mod
matrix([[3, 4]])

>>> basis_mod = basis.copy()
>>> basis_mod[0] = [5, 6]
>>> basis
matrix([[3, 4]])
>>> basis_mod
matrix([[5, 6]])
...