"Может показаться глупым, что у Python такой возможности нет, потому что в противном случае вы не сможете переопределить любую переменную, переданную через цикл for, если она является частью передаваемого спискачерез. " - Так работает большинство языков программирования.Разрешить эту возможность было бы плохо, потому что она создала бы нечто, называемое побочными эффектами, что делало код тупым.
Кроме того, это распространенная ошибка программирования, потому что вы должны хранить данные вне имен переменных : см. http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html (особенно список похожих вопросов; даже если вы не имеете дело с именами переменных, вы, по крайней мере, пытаетесь разобраться с пространством имен переменных).Средство защиты должно работать на «один уровень выше»: список или набор в этом случае.Вот почему ваш первоначальный вопрос не является разумным.(В некоторых версиях python вы можете взломать словарь locals()
, но это неподдерживаемое и недокументированное поведение и очень плохой стиль.)
Однако вы можете заставить python использовать побочные эффекты, например, так:
scores = [99.1, 78.3, etc.]
for i,score in enumerate(scores):
scores[i] = int(score)
приведенное выше округляет значения в массиве scores
.Однако правильный способ сделать это (если вы не работаете с сотнями миллионов элементов) - это воссоздать массив scores
следующим образом:
scores = [...]
roundedScores = [int(score) for score in scores]
Если у вас много вещейВы хотите сделать счет:
scores = [..., ..., ...]
def processScores(scores):
'''Grades on a curve, where top score = 100%'''
theTopScore = max(scores)
def processScore(score, topScore):
return 100-topScore+score
newScores = [processScore(s,theTopScore) for s in scores]
return newScores
sidenote: Если вы делаете вычисления с плавающей запятой, вы должны from __future__ import division
или использовать python3, или явным образом привести к float(...)
.
Если вы действительно хотите изменить передаваемое, вы можете передать изменяемый объект.Числа, которые вы передаете, являются экземплярами неизменяемых объектов, но если, например, у вас есть:
class Score(object):
def __init__(self, points):
self.points = points
def __repr__(self):
return 'Score({})'.format(self.points)
scores = [Score(i) for i in [99.1, 78.3, ...]]
for s in scores:
s.points += 5 # adds 5 points to each score
Это все равно будет нефункциональным способом выполнения действий и, таким образом, будет склонен ко всем проблемам, с которыми сталкиваются-эффекты причина.