Я не знаю, является ли это «эффективным», но это также работает:
x = [1,2,3,4]
x.insert(0,x.pop())
РЕДАКТИРОВАТЬ: еще раз Здравствуйте, я только что нашел большую проблему с этим решением!
Рассмотрим следующий код:
class MyClass():
def __init__(self):
self.classlist = []
def shift_classlist(self): # right-shift-operation
self.classlist.insert(0, self.classlist.pop())
if __name__ == '__main__':
otherlist = [1,2,3]
x = MyClass()
# this is where kind of a magic link is created...
x.classlist = otherlist
for ii in xrange(2): # just to do it 2 times
print '\n\n\nbefore shift:'
print ' x.classlist =', x.classlist
print ' otherlist =', otherlist
x.shift_classlist()
print 'after shift:'
print ' x.classlist =', x.classlist
print ' otherlist =', otherlist, '<-- SHOULD NOT HAVE BIN CHANGED!'
Метод shift_classlist () выполняет тот же код, что и мой x.insert (0, x.pop ()) - решение, otherlist - это список, независимый от класса. После передачи содержимого otherlist в список MyClass.classlist вызов функции shift_classlist () также изменяет список других списков:
КОНСОЛЬНЫЙ ВЫХОД:
before shift:
x.classlist = [1, 2, 3]
otherlist = [1, 2, 3]
after shift:
x.classlist = [3, 1, 2]
otherlist = [3, 1, 2] <-- SHOULD NOT HAVE BIN CHANGED!
before shift:
x.classlist = [3, 1, 2]
otherlist = [3, 1, 2]
after shift:
x.classlist = [2, 3, 1]
otherlist = [2, 3, 1] <-- SHOULD NOT HAVE BIN CHANGED!
Я использую Python 2.7. Я не знаю, является ли это ошибкой, но я думаю, что более вероятно, что я что-то здесь неправильно понял.
Кто-нибудь из вас знает, почему это происходит?