Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 7, 2010 15:19:14

Вит
От:
Зарегистрирован: 2010-01-07
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Странности с print и присвоением значения функции

Здравствуйте!
Понадобилось написать программу, которая бы находила базисные вектора обратной решётки для этого написал программу на питоне:

#-*- coding: utf-8 -*-

a1={"x": 1, "y": 0, "z": 0 }
a2={"x": 0, "y": 1, "z": 0 }
a3={"x": 0, "y": 0, "z": 1 }
b1={"x": 0, "y": 0, "z": 0 }
b2={"x": 0, "y": 0, "z": 0 }
b3={"x": 0, "y": 0, "z": 0 }
v={"x": 0, "y": 0, "z": 0 }

def scalar(first = None, second = None): #вычисление скалярного произведения координат
return first["x"]*second["x"]+first["y"]*second["y"]+first["z"]*second["z"]

def vector(first = None,second = None): #вычисление векторного произведения
v["x"]=first["y"]*second["z"]-first["z"]*second["y"]
v["y"]=first["z"]*second["x"]-first["x"]*second["z"]
v["z"]=first["x"]*second["y"]-first["y"]*second["x"]
return v

def triple(first = None, second = None, third = None): #вычисление смешанного произведения
return scalar(first,vector(second,third))

def recvect1(first = None, second = None, third = None): #вычисление первого вектора обратной решетки
b1 = vector(second,third)
div = triple(first,second,third)
b1["x"] = b1["x"]/div
b1["y"] = b1["y"]/div
b1["z"] = b1["z"]/div
return b1

def recvect2(first = None, second = None, third = None): #вычисление второго вектора обратной решетки
b2 = vector(third,first)
div = triple(second,third,first)
b2["x"] = b2["x"]/div
b2["y"] = b2["y"]/div
b2["z"] = b2["z"]/div
return b2

def recvect3(first = None, second = None, third = None): #вычисление третьего вектора обратной решетки
b3 = vector(first,second)
div = triple(third,first,second)
b3["x"] = b3["x"]/div
b3["y"] = b3["y"]/div
b3["z"] = b3["z"]/div
return b3

b1 = recvect1(a1,a2,a3)
print b1
b2 = recvect2(a1,a2,a3)
print b2
print "b1 now is ", b1
b3 = recvect3(a1,a2,a3)
print b3
print "b2 now is ", b2
print "b1 now is ", b1
В результате выполнения получается, что после каждого из присвоений в конце меняется значение предыдущей переменной:

{'y': 0, 'x': 1, 'z': 0}
{'y': 1, 'x': 0, 'z': 0}
b1 now is {'y': 1, 'x': 0, 'z': 0}
{'y': 0, 'x': 0, 'z': 1}
b2 now is {'y': 0, 'x': 0, 'z': 1}
b1 now is {'y': 0, 'x': 0, 'z': 1}
Почему так происходит?
Почему он сам упорядочивает список, так что он начинается с “y”, а не с “x”?



Офлайн

#2 Янв. 7, 2010 19:31:43

Evgen
От:
Зарегистрирован: 2007-01-18
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Странности с print и присвоением значения функции

Что бы значение не менялось нужно объявление вектора v перенести из глобальной области в ту функцию где он используется.
А для словарей порядок вывода вроде бы не гарантируется. Напишите вспомогательную функцию для вывода вектора так как вам надо, что-нибудь типа этого:

def print_d(d):
print "{x = %(x)s, y = %(y)s, z = %(z)s}" % d



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version