Как я могу оценить переменную для другой переменной перед назначением?
Этот вопрос разбит на подвопросы:
- Указатели в Python, предложенные одним ответом, чтобы посмотреть, больше здесь
- "Почему бы не изменить местных жителей?" вопрос здесь.
Оригинальный вопрос
#!/usr/bin/python
#
# Description: trying to evaluate array -value to variable before assignment
# but it overwrites the variable
#
# How can I evaluate before assigning on the line 16?
#Initialization, dummy code?
x=0
y=0
variables = [x, y]
data = ['2,3,4', '5,5,6']
# variables[0] should be evaluted to `x` here, i.e. x = data[0], how?
variables[0] = data[0]
if ( variables[0] != x ):
print("It does not work, why?");
else:
print("It works!");
Цель: исправить жестко запрограммированные назначения в лабораторном отчете, прежде чем я смогу более эффективно использовать составления списков, мне нужно решить проблему с назначениями - или я что-то не так делаю?
#!/usr/bin/python
#
# Description: My goal is to get the assignments on the line 24 not-hard-coded
variables = [y, x, xE]
files = [measurable, time, timeErr]
# PROBLEM 1: Assignment problem
#
#Trying to do:
#
# var[1] = files[1] so that if (y == measurable): print("it works")
# var[2] = files[2] so that if (x == time): print("it works")
#GOAL TO GET ASSIGNMENT LIKE, data is in files "y, x, xE":
#
# y = [3840,1840,1150,580,450,380,330,340,340,2723]
# x = [400.0,204.1,100.0,44.4,25.0,16.0,11.1,8.2,7.3,277.0]
# xE = [40, 25, 20, 20, 20, 20, 20, 20, 20, 35]
#Trying to do this
#
# y = open('./y').read();
# x = open('./x').read();
# xE= open('./xE').read();
#
# like this? f evaluated each time?
for f in files:
f = open('./'+f).read()
7 ответов
Похоже, вы просто обдумываете проблему. Подумайте, какой реальный результат вы хотите получить. Этот код настолько запутан, что я даже не уверен, какую именно проблему вы пытаетесь решить. Я вижу одну из двух возможностей (которые кажутся разумными - есть бесконечные необоснованные):
Вы хотите назначить x = '2,3,4' и y = '5,5,6', но у вас нет значений во время инициализации x и y. В этом случае вы бы сделали:
data = [] ... data is eventually populated ... x, y = data
Вам нужен словарь с ключами x и y с соответствующими значениями из данных, в этом случае вы должны сделать:
klist = ['x', 'y'] data = ['2,3,4', '5,5,6'] mydict = dict(zip(klist, data)) # mydict['x'] == '2,3,4'
Я бы использовал словарь с небольшим количеством косвенных ссылок. Если вы хотите использовать имена динамических переменных, это намек на то, что вам следует использовать не реальные переменные, а какую-то структуру данных, такую как список или dict.
Попробуйте использовать две структуры данных: список называется variables
который хранит имена переменных, и диктант под названием values
который хранит их значения.
variables = ['y', 'x', 'xE']
values = dict((name, None) for name in variables)
files = [measurable, time, timeErr]
# PROBLEM 1: Assignment problem
#
# Trying to do:
#
# var[1] = files[1] so that if (y == measurable): print("it works")
# var[2] = files[2] so that if (x == time): print("it works")
values[variables[1]] = files[1]
values[variables[2]] = files[2]
if values['y'] == measurable:
print("it works")
# GOAL TO GET ASSIGNMENT LIKE, data is in files "y, x, xE":
for name in variables:
variables[name] = open('./'+name).read()
У вас есть общее представление о том, как работают ссылки, но вы запутались. Когда вы называете заявление variables[0] = data[0]
вместо того, чтобы переназначить что x
указывает вам переназначить то, что variables[0]
указывает на. Вот почему "это не работает".
Вот:
x = 0
y = x
y = 4
что лежит в основе того, что вы пытаетесь сделать. Если вы введете это в REPL, вы увидите, что x
по-прежнему равняется 0, а не 4.
Ваши запутанные указатели со ссылками.
x=0
variables = [x, y]
это не будет иметь значения, так как его собираются переназначитьvariables[0] = data[0]
переменные [0] == ['2,3,4]
в 3 вы думаете, у вас есть ссылка на х. Но ты не! У вас есть только ссылка на переменные [0]
Может быть, вы думаете о чем-то вроде этого:
x = [1]
var = [x]
var[0][0] = 2
print var, x
>>> [[2]] [2]
Это на самом деле изменит значение х. Списки и словари будут меняться (как в mutatable
) пока строк и цифр не будет. Нет способа получить ссылку на них, чтобы изменить базовое значение.
... ах, я думаю, я получаю то, что вы хотите. Существует 99% вероятность, что это не очень хорошая идея, но я дам вам код, чтобы сделать то, о чем я думаю, вы все равно просите:
Сначала вам нужно изменить эту строку:
variables = ['x','y']
(так как вы хотите здесь имена переменных, а не значения)
Теперь для того, чтобы переменная x
быть назначенным, один из способов сделать это:
locals()[variables[0]] = data[0]
[Частичное решение]
Я думаю, что Gerrat правильно использует локальные ограничения, здесь ограничения, потому что некоторые данные в лабораторных отчетах никогда не изменятся.
#!/usr/bin/python
#
# Description: smelling overuse, probably a roundabout of other problem, rethinking...
variables = ['x','y']
datas = ['1,2,3,4', '4,44,8,3']
for var, data in zip(variables, datas):
locals()[var] = data
#Testing
print(x +" should be '1,2,3,4'");
print(y +" should be '4,44,8,3'");
[РЕШЕНИЕ]
Джонси и Джон Кугельман замечают другую проблему, вам нужно использовать динамические структуры данных, такие как словарь, приведенный ниже пример очистки.
variables = ['y', 'x', 'xE']
values = dict((name, None) for name in variables)
# GOAL TO GET ASSIGNMENT LIKE, data is in files "y, x, xE":
for name in variables:
values[name] = open('./'+name).read()
# Testing, prints the contents
for val in variables:
print(values[val]);
[Решение 2] Джонси, это на самом деле самый ясный код.
klist = ['x', 'y']
data = ['2,3,4', '5,5,6']
mydict = dict(zip(klist, data))
# mydict['x'] == '2,3,4'
Ваша проблема в том, что при инициализации переменных переменные [0] становятся 0, значением x. И тогда вы перезаписываете это значение новым значением.
Следующий код выводит 0, а не 1.
#!/usr/bin/python
#
# Description: trying to evaluate array -value to variable before assignment
# but it overwrites the variable
#
# How can I evaluate before assigning on the line 16?
#Initialization, dummy code?
x=0
y=0
variables = [x, y]
data = ['2,3,4', '5,5,6']
x = 1
variables[0] = data[0]
print(variables[0]);
Вы можете получить желаемый результат, поместив x в массив и разыменовав.
#!/usr/bin/python
#
# Description: trying to evaluate array -value to variable before assignment
# but it overwrites the variable
#
# How can I evaluate before assigning on the line 16?
#Initialization, dummy code?
x=[0]
y=[0]
variables = [x, y]
data = ['2,3,4', '5,5,6']
# variables[0] should be evaluted to `x` here, i.e. x = data[0], how?
variables[0][0] = data[0]
if ( variables[0][0] != x[0] ):
print("It does not work, why?");
else:
print("It works!");