Как я могу оценить переменную для другой переменной перед назначением?

Этот вопрос разбит на подвопросы:

  • Указатели в 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 ответов

Решение

Похоже, вы просто обдумываете проблему. Подумайте, какой реальный результат вы хотите получить. Этот код настолько запутан, что я даже не уверен, какую именно проблему вы пытаетесь решить. Я вижу одну из двух возможностей (которые кажутся разумными - есть бесконечные необоснованные):

  1. Вы хотите назначить x = '2,3,4' и y = '5,5,6', но у вас нет значений во время инициализации x и y. В этом случае вы бы сделали:

    data = []
    ... data is eventually populated ...
    x, y = data
    
  2. Вам нужен словарь с ключами 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.

Ваши запутанные указатели со ссылками.

  1. x=0
  2. variables = [x, y] это не будет иметь значения, так как его собираются переназначить
  3. 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!");
Другие вопросы по тегам